package com.mcp.converter.infrastructure.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.sql.DataSource;
import java.util.Properties;

/**
 * Oracle数据源连接配置
 *
 * @author zengxiong
 * @since 2025/05/20 11:08
 */
@Slf4j
@Component
public class OracleClient {
    
    private static final String ORACLE_DRIVER_CLASS = "oracle.jdbc.driver.OracleDriver";
    
    /**
     * 创建Oracle数据源
     * 
     * @param url Oracle数据库连接URL
     * @param username 用户名
     * @param password 密码
     * @return DataSource 数据源对象
     * @throws IllegalArgumentException 当参数为空时抛出异常
     */
    public static DataSource createDataSource(String url, String username, String password) {
        // 参数验证
        if (!StringUtils.hasText(url) || !StringUtils.hasText(username) || !StringUtils.hasText(password)) {
            throw new IllegalArgumentException("Oracle连接参数不能为空: url=" + url + ", username=" + username);
        }
        
        log.info("创建Oracle数据源, URL: {}, 用户名: {}", url, username);
        
        try {
            DriverManagerDataSource dataSource = new DriverManagerDataSource();
            dataSource.setDriverClassName(ORACLE_DRIVER_CLASS);
            dataSource.setUrl(url);
            dataSource.setUsername(username);
            dataSource.setPassword(password);
            
            // 设置Oracle连接属性
            Properties connectionProperties = getProperties();

            dataSource.setConnectionProperties(connectionProperties);
            
            log.info("Oracle数据源创建成功");
            return dataSource;
            
        } catch (Exception e) {
            log.error("创建Oracle数据源失败: {}", e.getMessage(), e);
            throw new RuntimeException("创建Oracle数据源失败", e);
        }
    }

    private static Properties getProperties() {
        Properties connectionProperties = new Properties();
        // 读取超时时间 (30分钟) - 增加超时时间解决超时问题
        connectionProperties.setProperty("oracle.jdbc.ReadTimeout", "1800000");
        // 连接超时时间 (5分钟) - 增加连接超时时间
        connectionProperties.setProperty("oracle.net.CONNECT_TIMEOUT", "300000");
        // 启用批量处理 - 增加批量大小提高性能
        connectionProperties.setProperty("defaultBatchValue", "5000");
        // 设置字符集
        connectionProperties.setProperty("oracle.jdbc.defaultNChar", "true");
        // 优化网络性能
        connectionProperties.setProperty("oracle.net.disableOob", "true");
        // 增加行预取数量提高查询性能
        connectionProperties.setProperty("oracle.jdbc.defaultRowPrefetch", "100");
        // 启用语句缓存
        connectionProperties.setProperty("oracle.jdbc.implicitStatementCacheSize", "50");
        return connectionProperties;
    }
}
